package menu_api

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"giv-vue-blog/global"
	"giv-vue-blog/models"
	"giv-vue-blog/models/res"
	"gorm.io/gorm"
)

// MenuDelView 删除菜单.
// @Summary 删除菜单
// @Description 删除菜单
// @Tags 菜单管理
// @Accept json
// @Produce json
// @Param delIDList body models.DelIDList true "ID List of menus to be deleted"
// @Success 200 {string} string "删除成功"
// @Router /api/menu [delete]
func (MenuApi) MenuDelView(c *gin.Context) {
	// models.DelIDList 的定义的全局通用的根据id删除的一个结构体
	var ad models.DelIDList
	err := c.ShouldBindJSON(&ad)
	if err != nil {
		res.FailedWithError(err, &ad, c)
		return
	}
	var menuList []models.MenuModel
	count := global.DB.Find(&menuList, ad.DelIDList).RowsAffected
	if count == 0 {
		res.FailedWithMsg("不存在的菜单", c)
		return
	}
	//采用事务进行删除  如果分开写两条删除语句 其中一条未执行成功会造成一些错误
	err = global.DB.Transaction(func(tx *gorm.DB) error {
		err = global.DB.Model(&menuList).Association("Banners").Clear()
		if err != nil {
			global.Log.Error(err)
			//res.FailedWithMsg("删除关联的banner失败", c)
			return err
		}
		err = global.DB.Delete(&menuList).Error
		if err != nil {
			//res.FailedWithMsg("删除菜单失败", c)
			return err
		}
		return nil
	})
	if err != nil {
		global.Log.Error(err)
		res.FailedWithMsg("删除菜单失败", c)
		return
	}
	res.OkWithMsg(fmt.Sprintf("共删除 %d 条菜单", count), c)
}
